#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
最终演示脚本 - 展示完整的深圳餐饮数据抓取流程
"""

import sys
import asyncio
import logging
from pathlib import Path
from datetime import datetime

# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

from src.crawler.crawler_engine import CrawlerEngine
from src.data.data_processor import DataProcessor
from src.utils.excel_exporter import ExcelExporter


async def final_demo():
    """最终演示：完整的深圳餐饮数据抓取流程"""
    
    # 设置日志
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s [%(levelname)s] %(message)s',
        handlers=[
            logging.StreamHandler(sys.stdout),
            logging.FileHandler(f'logs/final_demo_{datetime.now().strftime("%Y%m%d_%H%M%S")}.log', encoding='utf-8')
        ]
    )
    
    logger = logging.getLogger(__name__)
    
    print("🎉 深圳餐饮线索数据抓取系统 - 最终演示")
    print("=" * 60)
    
    try:
        # 创建组件
        logger.info("初始化系统组件...")
        crawler = CrawlerEngine()
        processor = DataProcessor()
        exporter = ExcelExporter()
        
        # 启动爬虫引擎
        logger.info("启动爬虫引擎...")
        await crawler.start(headless=True)
        print("✅ 爬虫引擎启动成功")
        
        # 执行数据抓取
        logger.info("开始抓取深圳餐饮数据...")
        print("🔍 正在抓取深圳餐饮线索数据...")
        
        raw_data = await crawler.crawl_shenzhen_catering(max_pages=1)
        
        if not raw_data:
            print("❌ 未获取到任何数据")
            return False
        
        print(f"📊 原始数据获取完成：{len(raw_data)} 条")
        
        # 数据处理
        logger.info("开始数据处理...")
        print("🔧 正在处理和清洗数据...")
        
        processed_data = processor.process_crawled_data(raw_data)
        
        if not processed_data:
            print("❌ 数据处理后无有效数据")
            return False
        
        print(f"✅ 数据处理完成：{len(processed_data)} 条有效数据")
        
        # 去重处理
        logger.info("开始去重处理...")
        dedup_result = processor.detect_duplicates(processed_data)
        unique_data = dedup_result['unique_data']
        
        print(f"🔄 去重完成：唯一数据 {len(unique_data)} 条，重复数据 {dedup_result['duplicate_count']} 条")
        
        # 生成质量报告
        quality_report = processor.generate_quality_report(unique_data)
        
        print("\n📈 数据质量报告：")
        print(f"   总记录数：{quality_report['total_records']}")
        print(f"   有效记录数：{quality_report['valid_records']}")
        print(f"   质量分数：{quality_report['quality_score']}%")
        
        print("\n📋 字段完整性：")
        for field, percentage in quality_report['field_completeness'].items():
            print(f"   {field}: {percentage:.1f}%")
        
        # 展示数据样例
        print("\n📝 数据样例（前5条）：")
        for i, item in enumerate(unique_data[:5]):
            print(f"\n第{i+1}条：")
            print(f"   城市：{item.get('city', 'N/A')}")
            print(f"   联系人：{item.get('contact_person', 'N/A')}")
            print(f"   业态：{item.get('business_type', 'N/A')}")
            print(f"   面积：{item.get('building_area', 'N/A')}")
            print(f"   租金：{item.get('acceptable_rent', 'N/A')}")
        
        # 导出到Excel
        logger.info("导出数据到Excel...")
        print("\n💾 正在导出数据到Excel...")
        
        excel_file = exporter.export_leads_data(unique_data, "深圳餐饮线索最终演示")
        
        if excel_file:
            print(f"✅ Excel文件已保存：{excel_file}")
        else:
            print("❌ Excel导出失败")
        
        # 统计分析
        print("\n📊 数据统计分析：")
        
        # 业态分布
        business_types = {}
        for item in unique_data:
            bt = item.get('business_type', '未知')
            business_types[bt] = business_types.get(bt, 0) + 1
        
        print("   业态分布：")
        for bt, count in sorted(business_types.items(), key=lambda x: x[1], reverse=True):
            print(f"     {bt}: {count}条")
        
        # 面积分布
        area_ranges = {'小型(≤50㎡)': 0, '中型(50-100㎡)': 0, '大型(>100㎡)': 0, '未知': 0}
        for item in unique_data:
            area = item.get('building_area', '')
            if '20-50' in area or '50' in area:
                if '50-100' in area or '60-100' in area or '70-100' in area:
                    area_ranges['中型(50-100㎡)'] += 1
                else:
                    area_ranges['小型(≤50㎡)'] += 1
            elif '100' in area and ('200' in area or '300' in area):
                area_ranges['大型(>100㎡)'] += 1
            else:
                area_ranges['未知'] += 1
        
        print("   面积分布：")
        for range_name, count in area_ranges.items():
            if count > 0:
                print(f"     {range_name}: {count}条")
        
        print("\n🎉 深圳餐饮线索数据抓取演示完成！")
        print("=" * 60)
        print("✅ 系统功能验证：")
        print("   ✓ 网站访问和页面解析")
        print("   ✓ 数据提取和字段映射")
        print("   ✓ 数据清洗和验证")
        print("   ✓ 去重和质量评估")
        print("   ✓ Excel导出和数据分析")
        print("\n🚀 系统已准备就绪，可以进行大规模数据抓取！")
        
        return True
        
    except Exception as e:
        logger.error(f"演示失败: {e}")
        print(f"❌ 演示失败：{e}")
        return False
        
    finally:
        await crawler.stop()
        print("\n🔚 爬虫引擎已关闭")


if __name__ == "__main__":
    success = asyncio.run(final_demo())
    if success:
        print("\n✅ 最终演示成功完成！")
        exit(0)
    else:
        print("\n❌ 最终演示失败！")
        exit(1)
